package etm.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import upc.condominio.modelo.Mensaje;
import upc.condominio.modelo.Residente;
import upc.condominio.modelo.Usuario;
import upc.condominio.util.ConexionBD;
import etm.excepcion.DAOExcepcion;

public class MensajeDAO extends BaseDAO {

//	public Collection<Mensaje> buscarPorNombre(String nombre)
//			throws DAOExcepcion {
//		String query = "select id_categoria, nombre, descripcion from categoria where nombre like ?";
//		Collection<Categoria> lista = new ArrayList<Categoria>();
//		Connection con = null;
//		PreparedStatement stmt = null;
//		ResultSet rs = null;
//		try {
//			con = ConexionBD.obtenerConexion();
//			stmt = con.prepareStatement(query);
//			stmt.setString(1, "%" + nombre + "%");
//			rs = stmt.executeQuery();
//			while (rs.next()) {
//				Categoria vo = new Categoria();
//				vo.setIdCategoria(rs.getInt("id_categoria"));
//				vo.setNombre(rs.getString("nombre"));
//				vo.setDescripcion(rs.getString("descripcion"));
//				lista.add(vo);
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarResultSet(rs);
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		System.out.println(lista.size());
//		return lista;
//	}

	public Mensaje insertar(Mensaje mensaje) throws DAOExcepcion {
		String query = "insert into Mensaje(idUsuario,Remitente,Asunto,Fecha,Contenido) values (?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, mensaje.getUsuario().getIdUsuario());
			stmt.setString(2, mensaje.getRemitente());
			stmt.setString(3, mensaje.getAsunto());
			stmt.setDate(4, mensaje.getFecha());			
			stmt.setString(5, mensaje.getContenido());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			mensaje.setIdMensaje(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return mensaje;
	}

	public Mensaje obtener(int idMensaje) throws DAOExcepcion {
		Mensaje mensaje = new Mensaje();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idUsuario,Remitente,Asunto,Fecha,Contenido from Mensaje where idMensaje=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idMensaje);
			rs = stmt.executeQuery();
			if (rs.next()) {
				UsuarioDAO dao = new UsuarioDAO();				
				mensaje.setUsuario(dao.obtenerPorIdUsuario(rs.getInt("idUsuario")));
				mensaje.setRemitente(rs.getString(2));
				mensaje.setAsunto(rs.getString(3));
				mensaje.setFecha(rs.getDate(4));
				mensaje.setContenido(rs.getString(5));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return mensaje;
	}

	public void eliminar(int idMensaje) throws DAOExcepcion {
		String query = "delete from Mensaje WHERE idMensaje=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idMensaje);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}	

	public Collection<Mensaje> listar(Usuario usuario, String filtro) throws DAOExcepcion {
		Collection<Mensaje> lista = new ArrayList<Mensaje>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			if(filtro==null) filtro="";
			String query = "select idMensaje,idUsuario,Remitente,Asunto,Fecha,Contenido from Mensaje "
							+ " where idUsuario=? and Remitente like '"+filtro+"%' order by idMensaje desc";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, usuario.getIdUsuario());			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Mensaje mensaje = new Mensaje();
				mensaje.setIdMensaje(rs.getInt("idMensaje"));
				mensaje.setUsuario(usuario);
				mensaje.setRemitente(rs.getString("Remitente"));
				mensaje.setAsunto(rs.getString("Asunto"));
				mensaje.setFecha(rs.getDate("Fecha"));
				mensaje.setContenido(rs.getString("Contenido"));				
				
				lista.add(mensaje);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
}
